﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ModeloEntidades;

namespace AccesoDatos.DAO
{
    public class DAO_Habilitacion : DAO_Base_modelo_entidades
    {
        // Atributos de manejo de instancia (singleton)
        static DAO_Habilitacion instance = null;
        //------------------------------------------------------------------------------------------
        const string NOMBRE_BASE_DE_DATOS_PARA_HABILITACION = "Colegio-de-medicos-habilitaciones";

        public List<Habilitacion> obtener()
        {

            acceso_ModeloEntidades.Configuration.LazyLoadingEnabled = true;
            return acceso_ModeloEntidades.Habilitaciones.ToList();
        }

        public void guardar(Habilitacion unaHabilitacion)
        {
            acceso_ModeloEntidades.Habilitaciones.Add(unaHabilitacion);
            acceso_ModeloEntidades.SaveChanges();           
        }

        public void guardar_como_habilitada(Habilitacion unaHabilitacion)
        {
            cambiar_base_de_datos_a_habilitacion();
            guardar(unaHabilitacion);
            volver_a_base_de_datos_orginal();
            
        }

        private void cambiar_base_de_datos_a_habilitacion()
        {
            cambiar_base_de_datos(NOMBRE_BASE_DE_DATOS_PARA_HABILITACION);
        }

        public void guardar(Habilitacion unaHabilitacion, Localidad unaLocalidad)
        {
            // Primero guardamos la habiitacion
            guardar(unaHabilitacion); 
            //----------------------------------------------------------
            // Renovamos la conexion para tener un nuevo contexto
            renovarConexion();
            //---------------------------------------------------------
            // Asociamos la habilitacion guardada con la localidad 
            asociar(unaHabilitacion, unaLocalidad);          
        }


        public void asociar(Habilitacion unaHabilitacion, Localidad unaLocalidad)
        {
            // Consulto la habilitacion guardada anteriormente
            Habilitacion habilitacion_guardada = (from h in acceso_ModeloEntidades.Habilitaciones
                                                  where h.Id == unaHabilitacion.Id
                                                  select h).First();

            // Consulto la localidad para asociarla (tiene que ser del mismo conexto que la habilitacion)
            Localidad localidad_para_asociar = (from l in acceso_ModeloEntidades.Localidades
                                                where l.Id == unaLocalidad.Id
                                                select l).First();

            habilitacion_guardada.Tramite_Matriculacion.First().Consultorio.Local.Localidad = localidad_para_asociar;
            acceso_ModeloEntidades.SaveChanges();

        }
  

        public void actualizar(Habilitacion unaHabilitacion)
        {

            // Marco la entidad como modificada
            acceso_ModeloEntidades.Entry(unaHabilitacion).State = System.Data.EntityState.Modified;
            // Salvo los cambios de este nuevo conexto
            acceso_ModeloEntidades.SaveChanges();
        }


        public static DAO_Habilitacion Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAO_Habilitacion();
                        }
                    }
                }
                return instance;
            }
        }
    }
}
